﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
//2024.01.13比特假期作业代码题——day14
int func_14(char* s) {
	char* t = s;
	while (*t++);
	return t - s;
}
void test_14_1() {
	char s[100] = { 0 };
	scanf("%s", s);
	int ret = func_14(s);
	printf("%d\n", ret);
}

void test_14_2() {
	float a[3] = { 1.5,2.5,3.5 }, * pa = a; 
	*(pa++) *= 3;
	printf("%f\n", *pa);
}

void test_14_3() {
	int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }, * p = a + 5, * q = NULL;
	*q = *(p + 5);
	printf("%d %d\n", *p, *q);
}
void test_14_4() {
	char* p[] = { "Shanghai","Beijing","Honkong" };
	printf("%c\n", *(p[1] + 3));
}
void test_14_5() {
	int* p = 0;
	int* l = NULL;
	int a = 10;
	l = &a;
}
//珠玑妙算——哈希表、字符串、计数——简单
//珠玑妙算游戏（the game of master mind）的玩法如下。
//计算机有4个槽，每个槽放一个球，颜色可能是红色（R）、黄色（Y）、绿色（G）或蓝色（B）。
//例如，计算机可能有RGGB 4种（槽1为红色，槽2、3为绿色，槽4为蓝色）。
//作为用户，你试图猜出颜色组合。打个比方，你可能会猜YRGB。
//要是猜对某个槽的颜色，则算一次“猜中”；要是只猜对颜色但槽位猜错了，则算一次“伪猜中”。
//注意，“猜中”不能算入“伪猜中”。
//给定一种颜色组合solution和一个猜测guess，编写一个方法，返回猜中和伪猜中的次数answer，其中answer[0]为猜中的次数，answer[1]为伪猜中的次数。
//示例：
//输入： solution = "RGBY", guess = "GGRR"
//输出：[1, 1]
//解释： 猜中1次，伪猜中1次。
//提示：
//len(solution) = len(guess) = 4
//solution和guess仅包含"R", "G", "B", "Y"这4种字符
int* masterMind(char* solution, char* guess, int* returnSize) {
	if ((!solution) && (!guess) && (!returnSize))
		return NULL;
	*returnSize = 2;
	int* ans = (int*)calloc(2, sizeof(int));
	assert(ans);
	char ck = solution[0];
	int ik = 0;
	for (int i = 0; i < 4; i++) {
		if (ck != solution[i])
		{
			ck = solution[i];
			ik = i;
		}
		for (int j = 0; j < 4; j++) {

		}
	}
	return ans;
}
void test_14_6() {
	char ch1[4] = { 0 };
	char ch2[4] = { 0 };
	while (scanf("%s%s", ch1, ch2) == 2) {
		int size = 0;
		int* ret = masterMind(ch1, ch2, &size);
		for (int i = 0; i < size; i++) {
			printf("%d ", ret[i]);
		}
		printf("\n");
		free(ret);
	}
}
//两数之和——数组、哈希——简单
//描述
//给出一个整型数组 numbers 和一个目标值 target，请在数组中找出两个加起来等于目标值的数的下标，返回的下标按升序排列。
//（注：返回的数组下标从1开始算起，保证target一定可以由数组里面2个数字相加得到）
//数据范围：
//2≤len(numbers)≤10^5，−10≤numbers[i]≤10^9，0≤target≤10^9
//要求：空间复杂度:O(n)，时间复杂度:O(nlogn)
//示例1
//输入：
//[3, 2, 4], 6
//返回值：
//[2, 3]
//说明：
//因为 2 + 4 = 6 ，而2的下标为2 ,4的下标为3 ，又因为下标2 < 下标3 ，所以返回[2, 3]
//	示例2
//	输入：
//	[20, 70, 110, 150], 90
//	返回值：
//	[1, 2]
//说明：
//20 + 70 = 90

//法一：时间复杂度过高
int* twoSum1(int* numbers, int numbersLen, int target, int* returnSize) {
	if ((!numbers) && (!returnSize))
		return NULL;
	*returnSize = 2;
	int* ans = (int*)calloc(2, sizeof(int));
	assert(ans);
	for (int i = 0; i < numbersLen; i++) {
		int k = target - numbers[i];
		for (int j = i + 1; j < numbersLen; j++) {
			if (numbers[j] == k) {
				ans[0] = i + 1;
				ans[1] = j + 1;
			}
		}
	}
	return ans;
}
//法二：排除不符合要求的数据
int* twoSum1(int* numbers, int numbersLen, int target, int* returnSize) {
	if ((!numbers) && (!returnSize))
		return NULL;
	*returnSize = 2;
	int* ans = (int*)calloc(2, sizeof(int));
	assert(ans);
	for (int i = 0; i < numbersLen; i++) {
		if (numbers[i] > target + 10)
			continue;
		int k = target - numbers[i], flag = 1;
		for (int j = i + 1; j < numbersLen; j++) {
			if (numbers[j] == k) {
				ans[0] = i + 1;
				ans[1] = j + 1;
				flag = 0;
				break;
			}
		}
		if (!flag)
			break;
	}
	return ans;
}
void test_14_6() {
	int n = 0;
	while (scanf("%d", &n) == 1) {
		int* p = (int*)calloc(n, sizeof(int));
		assert(p);
		for (int i = 0; i < n; i++) {
			scanf("%d", &p[i]);
		}
		int k = 0;
		scanf("%d", &k);
		int size = 0;
		int* ret = twoSum(p, n, k, &size);
		for (int i = 0; i < size; i++) {
			printf("%d ", ret[i]);
		}
		free(p);
		free(ret);
	}
}
int main() {
	test_14_5();
	return 0;
}